package cn.biplam.common.wrapper.sqlresult;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;

import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.KvMap;

/**
 * 	 储存数据集的行ID
 * @author XiaoRuxing
 * @create8:53:47 PM
 * @version 1.0
 */
public class RowID implements Serializable{
	
	private static final long serialVersionUID = -5880240158115843393L;//类序列号
	private KvMap<String,Integer>  kvmMianOrdColMap;	 //主排序字段序号及其名称
	private ArrayList<String> alMainOrdColList; 		 //主排序字段列表
	private KvMap<String,Integer>  kvmSubOrdColMap;		 //辅助序字段序号及其名称
	private ArrayList<String>  alSubOrdColList; 		//辅助排序字段列表
	private ArrayList<String>  alMainColOrderType; 		//主排序字段序号,排序方式
	private HashMap<Integer,String>  hMainColValue;     //主排序字段序号,值
	private ArrayList<String>  alSubColOrderType;  		//辅助序字段序号,排序方式
	private HashMap<Integer,String>  hSubColValue;      //辅助序字段序号,值
	public static  int  DESC=1; //排序方式1
	public static  int  ASC=2;  //排序方式2	
	
	public RowID(){
		this.kvmMianOrdColMap=new KvMap<String,Integer>();
		this.kvmSubOrdColMap=new KvMap<String,Integer>();
		this.alMainColOrderType=new ArrayList<String>();
		this.hMainColValue=new HashMap<Integer,String>();
		this.alSubColOrderType=new ArrayList<String>();
		this.hSubColValue=new HashMap<Integer,String>();
		this.alMainOrdColList=new ArrayList<String>();
		this.alSubOrdColList=new ArrayList<String>();
	}
	
	/**
	 * 依序指定主排序字段及其排序方式
	 *	在队列最后加入字段及其排序方式
	 *	如果字段存在则不插入，更新其排序方式
	 * @param iColumnName	字段名
	 * @param iOrderType	排序方式
	 * @throws ErrorMessage 
	 */
	public void putMainOrderCol(String  sColumnName,int iOrderType) throws ErrorMessage{
		if(!alMainOrdColList.contains(sColumnName)){
			alMainOrdColList.add(sColumnName);
			alMainColOrderType.add(transOrderType(iOrderType));
			setMainOrderColMap(alMainOrdColList);			
		}else{
			alMainColOrderType.set(alMainOrdColList.indexOf(sColumnName),
					transOrderType(iOrderType));
		}
	}

	/**
	 * 按字段顺序指定主排序字段名称及其排序方式
	 *	在iColumnNum指定的顺序加入字段及其排序方式
	 *	如果字段存在则不插入，更新其排序方式
	 * @param iColumnNum  字段顺序
	 * @param iColumnName	字段名
	 * @param iOrderType	排序方式
	 * @throws ErrorMessage 
	 */
	public void putMainOrderCol(int iColumnNum,String  sColumnName,int iOrderType) throws ErrorMessage{
		if(!alMainOrdColList.contains(sColumnName)){
			alMainOrdColList.add(iColumnNum,sColumnName);
			alMainColOrderType.add(iColumnNum, transOrderType(iOrderType));
			setAllMainOrderColMap(alMainOrdColList);			
		}else{
			alMainColOrderType.set(alMainOrdColList.indexOf(sColumnName),transOrderType(iOrderType));
		}
	}
	
	/**
	 * 解析排序方式
	 * @param iOrderType 排序类型
	 * @return	排序方式
	 */
	private String transOrderType(int iOrderType){
		switch(iOrderType){
			case 1: return "desc";
			case 2: return "asc";
			default: return null;
		}
	}
	
	/**
	 * 指定主排序字段与其顺序映射关系
	 * @param al 
	 * @throws ErrorMessage 
	 */
	public void setMainOrderColMap(ArrayList<String> al) throws ErrorMessage{
		int index=al.size()-1;
		kvmMianOrdColMap.put(al.get(index),index);
	}
	
	/**
	 * 指定所有主排序字段与其顺序映射关系
	 * @param al
	 * @throws ErrorMessage 
	 */
	public void setAllMainOrderColMap(ArrayList<String> al) throws ErrorMessage{
		kvmMianOrdColMap.clear();
		for(int i=0;i<al.size();i++){
			kvmMianOrdColMap.put(al.get(i),i);
		}
	}
	
	/**
	 * 指定主排序字段值
	 * @param sColumnName 字段名称
	 * @param sValue	字段值
	 * @return	
	 */
	public  boolean  putMainOrderColValue(String sColumnName,String sValue){
		boolean boo=true;
		if(kvmMianOrdColMap.getByKey(sColumnName)!=null){
			int iColumnNumber=kvmMianOrdColMap.getByKey(sColumnName);
			hMainColValue.put(iColumnNumber, sValue);			
		}else{
			boo=false;
		}
		return boo;
	}
	
	/**
	 * 依序指定辅助排序字段及其排序方式
	 *	在队列最后插入字段及其排序方式
	 *	如果字段存在则不插入，更新其排序方式
	 * @param sColumnName  字段名
	 * @param iOrderType   排序方式
	 * @throws ErrorMessage 
	 */
	public  void  putSubOrderCol(String  sColumnName,int iOrderType) throws ErrorMessage{
		if(!alSubOrdColList.contains(sColumnName)){
			alSubOrdColList.add(sColumnName);
			alSubColOrderType.add(transOrderType(iOrderType));
			setSubOrderColMap(alSubOrdColList);			
		}else{
			alSubOrdColList.set(alSubOrdColList.indexOf(sColumnName), transOrderType(iOrderType));
		}
	}
	
	/**
	 * 按字段顺序指定主排序字段名称和排序方式
	 *	在iColumnNum指定的顺序加入字段及其排序方式
	 *	如果字段存在则不插入，更新其排序方式
	 * @param iColumnNum	字段顺序
	 * @param sColumnName	字段名
	 * @param iOrderType	排序方式
	 * @throws ErrorMessage 
	 */
	public  void  putSubOrderCol(int  iColumnNum,String  sColumnName,int iOrderType) throws ErrorMessage{
		if(!alSubOrdColList.contains(sColumnName)){
			alSubOrdColList.add(iColumnNum, sColumnName);
			alSubColOrderType.add(iColumnNum, transOrderType(iOrderType));
			setAllSubOrderColMap(alSubOrdColList);			
		}else{
			alSubOrdColList.set(alSubOrdColList.indexOf(sColumnName), transOrderType(iOrderType));
		}
	}
	
	/**
	 * 指定主排序字段与其顺序映射关系
	 * @param al
	 * @throws ErrorMessage 
	 */
	public void setSubOrderColMap(ArrayList<String> al) throws ErrorMessage{
		int index=al.size()-1;
			kvmSubOrdColMap.put(al.get(index),index);		 
	}
	/**
	 * 指定所有主排序字段与其顺序映射关系
	 * @param al
	 * @throws ErrorMessage 
	 */
	public void setAllSubOrderColMap(ArrayList<String> al) throws ErrorMessage{
		kvmSubOrdColMap.clear();
		for(int i=0;i<al.size();i++){
			kvmSubOrdColMap.put(al.get(i),i);
		}
	}
	
	/**
	 * 指定辅助字段值
	 * @param sColumnName	字段名
	 * @param sValue	字段值
	 * @return	
	 */
	public boolean putSubOrderColValue(String sColumnName,String sValue){
		boolean boo=true;
		if(kvmSubOrdColMap.getByKey(sColumnName)!=null){
			int iColNumber=kvmSubOrdColMap.getByKey(sColumnName);
			hSubColValue.put(iColNumber, sValue);			
		}else{
			boo=false;
		}
		return boo;
	}

	/**
	 * 返回排序字符串
	 * @return 排序字符串
	 */
	public String getOrderSql(){
		StringBuffer sql=new StringBuffer();
		for(int i=0;i<alMainOrdColList.size();i++){
			if(i<alMainOrdColList.size()-1){
				sql.append(alMainOrdColList.get(i)+" "+alMainColOrderType.get(i)+",");				
			}else{
				sql.append(alMainOrdColList.get(i)+" "+alMainColOrderType.get(i));
			}
		}
		if(alSubOrdColList.size()>0){
			sql.append(",");
		}
		for(int i=0;i<alSubOrdColList.size();i++){
			if(i<alSubOrdColList.size()-1){
				sql.append(alSubOrdColList.get(i)+" "+alSubColOrderType.get(i)+",");				
			}else{
				sql.append(alSubOrdColList.get(i)+" "+alSubColOrderType.get(i));
			}
		}
		return sql.toString();
	}
	
	/**
	 * 返回排序字段值
	 * @param sColumnName 字段名
	 * @return	字段值
	 */
	public String getOrderColumnValue(String sColumnName){
		if(kvmMianOrdColMap.containsKey(sColumnName)){
			return hMainColValue.get(kvmMianOrdColMap.getByKey(sColumnName));
		}else{
			return hSubColValue.get(kvmSubOrdColMap.getByKey(sColumnName));
		}
	}
}
